/**
 * 内部类，用于抽象事件监听机制，为集成该类的子类建立统一的事件监听机制
 * @author wangjm
 * @version 0.1.0
 * @createtime 2015-03-17
 * 
 * @version 0.1.1 监听返回值添加suspend和resume函数，用于暂停和重启事件的监听
 */
define(["base/declare","base/lang"],function(declare,lang){
	return declare([],{
		constructor: function(cfg){
			this.handlers = {};
		},
		//定义统一的事件注册和事件触发机制。
		/**
		 * 注册事件
		 * @param type 事件的名称，通过该名称进行事件的触发
		 * @param handler 回调函数
		 * @return 返回值有一个off函数，用于取消该事件的注册
		 *  				一个suspend函数，用于暂停该回调函数的监听
		 *                 一个resume函数，用于重启该回调函数的监听
		 */
		on : function(type,handler){
			if(typeof this.handlers[type] == "undefined"){
				this.handlers[type]=[];
			}
			this.handlers[type].push(handler);
			var that = this;
			return {
				offed:false,
				//暂停该函数的监听
				suspend : function(){
					if(this.offed){
						return;
					}
					var handlers = that.handlers[type];
					if(handlers instanceof Array){
						$.each(handlers,function(i,h){
							if(h==handler){
								handlers.splice(i,1);
							}
						});
					}
				},//重启该函数的监听
				resume : function(){
					if(this.offed){
						return;
					}
					that.handlers[type].push(handler);
				},//停止该函数的监听
				off:function(){
					if(this.offed){
						return;
					}
					this.suspend();
					this.offed = true;
				}
			};
		},
		/**
		 * 触发事件，并且传入相应的参数
		 * @param type 事件的名称
		 * @param data 传递的参数
		 * @param scope 指定回调函数的作用域，如果不指定，则为调用该方法的对象本身
		 * @return null
		 */
		fire : function(type,data,scope){
			var that = this;
			if(this.handlers[type] instanceof Array){
				$.each(this.handlers[type],function(i,handler){
					lang.hitch(scope||that,handler)(data);
//					try{lang.hitch(that,handler)(data);}catch(e){if(console){console.info(e);}};
				});
			}
		},off : function(type){//停止所有监听
			if(type){
				delete this.handlers[type];
				this.handlers[type] = [];
			}else{
				delete this.handlers;
				this.handlers = {};
			}
		}
	});
});